package manager.modulo.orcamento.dao;

import java.sql.SQLException;
import manager.auxiliares.MensagemExcessao;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.LinkedList;
import manager.auxiliares.Configurations;
import manager.principal.fonte.JanelaLogin;
import manager.interfaces.InterfaceDao;
import manager.modulo.estoque.enumerator.EnumTipoInsumo;
import manager.modulo.estoque.enumerator.EnumTipoInsumo.TipoInsumo;
import manager.modulo.estoque.enumerator.EnumUnidadeInsumo;
import manager.modulo.estoque.enumerator.EnumUnidadeInsumo.UnidadeInsumo;

/**
 * Esta classe será utilizada para cadastra a entidade user no banco de dados
 *
 * @author Thiago
 */
public class InsumoOrcamentoDao implements InterfaceDao {

    private int id;
    private String nome;
    private String identificador;
    private UnidadeInsumo unidadeInsumo;
    private int quantidade;
    private int valorUnitario;
    private int idOrcamento;
    private TipoInsumo tipoInsumo;
    private int idInsumo;

    /**
     * Inicializando as variáveis
     */
    public InsumoOrcamentoDao() {
        nome = "";
        identificador = "";
        unidadeInsumo = UnidadeInsumo.NAOENCONTRADO;
        quantidade = 0;
        valorUnitario = 0;
        idOrcamento = 0;
        tipoInsumo = TipoInsumo.NAOENCONTRADO;
        idInsumo = 0;
    }

    public static LinkedList<InsumoOrcamentoDao> listarInsumoOrcamentoPorOrcemento(int idOrcamento) {
        LinkedList<InsumoOrcamentoDao> listaItemOrcamento = new LinkedList<InsumoOrcamentoDao>();
        try {
            String sql = "SELECT id FROM insumo_orcamento WHERE id_orcamento = ? ";
            PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
            preparedStatement.setInt(1, idOrcamento);
            ResultSet resultSet = preparedStatement.executeQuery();
            while (resultSet.next()) {
                InsumoOrcamentoDao itemOrcamentoDao = new InsumoOrcamentoDao();
                itemOrcamentoDao.buscar(resultSet.getInt("id"));
                listaItemOrcamento.add(itemOrcamentoDao);
            }
            return listaItemOrcamento;
        } catch (Exception e) {
            MensagemExcessao.mostrarMensagem(e, "Buscando Lista de Insumos");
        }
        return listaItemOrcamento;
    }

    public static LinkedList<InsumoOrcamentoDao> listarInsumoOrcamentoResumida(int idOrcamento) {
        LinkedList<InsumoOrcamentoDao> listaInsumoOrcamento = new LinkedList<InsumoOrcamentoDao>();
        try {
            String sql
                    = "SELECT\n" +
"                      io.id AS Id,\n" +
"                      io.tx_nome AS Nome,\n" +
"                      io.tx_identificador AS Identificador,\n" +
"                      io.nm_valor_unitario AS ValorUnitario,\n" +
"                      io.cd_tipo_insumo AS TipoInsumo,\n" +
"                      io.cd_unidade_insumo AS UnidadeInsumo,\n" +
"                      sum(io.nm_quantidade) AS Quantidade\n" +
"                    FROM\n" +
"                      insumo_orcamento io\n" +
"                    WHERE\n" +
"                     io.id_orcamento = ? \n" +
"                    GROUP BY io.id_insumo";
            PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
            preparedStatement.setInt(1, idOrcamento);
            ResultSet resultSet = preparedStatement.executeQuery();
            while (resultSet.next()) {
                InsumoOrcamentoDao insumoOrcamentoDao = new InsumoOrcamentoDao();
                insumoOrcamentoDao.setId(resultSet.getInt("Id"));
                insumoOrcamentoDao.setNome(resultSet.getString("Nome"));
                insumoOrcamentoDao.setIdentificador(resultSet.getString("Identificador"));
                insumoOrcamentoDao.setValorUnitario(resultSet.getInt("ValorUnitario"));
                insumoOrcamentoDao.setTipoInsumo(EnumTipoInsumo.ConverterNumeroEnum(resultSet.getInt("TipoInsumo")));
                insumoOrcamentoDao.setUnidadeInsumo(EnumUnidadeInsumo.ConverterNumeroEnum(resultSet.getInt("UnidadeInsumo")));
                insumoOrcamentoDao.setQuantidade(resultSet.getInt("Quantidade"));
                listaInsumoOrcamento.add(insumoOrcamentoDao);
            }
            return listaInsumoOrcamento;
        } catch (Exception e) {
            MensagemExcessao.mostrarMensagem(e, "Buscando Lista de Insumos");
        }
        return listaInsumoOrcamento;
    }

    /**
     * Carregar as informações do objeto usuário a partir de um id
     *
     * @param id Id do usuário buscado
     */
    public void buscar(int id) {
        try {
            setId(id);
            String sql = "SELECT * FROM insumo_orcamento WHERE id = ?";
            PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql);
            preparedStatement.setInt(1, id);
            ResultSet resultSet = preparedStatement.executeQuery();
            if (resultSet.first()) {
                nome = resultSet.getString("tx_nome");
                identificador = resultSet.getString("tx_identificador");
                unidadeInsumo = EnumUnidadeInsumo.ConverterNumeroEnum(resultSet.getInt("cd_unidade_insumo"));
                quantidade = resultSet.getInt("nm_quantidade");
                valorUnitario = resultSet.getInt("nm_valor_unitario");
                idOrcamento = resultSet.getInt("id_orcamento");
                tipoInsumo = EnumTipoInsumo.ConverterNumeroEnum(resultSet.getInt("cd_tipo_insumo"));
                idInsumo = resultSet.getInt("id_insumo");
            }
            resultSet.close();
            preparedStatement.close();
        } catch (Exception e) {
            MensagemExcessao.mostrarMensagem(e, "Buscando Insumos de Orçamento");
        }
    }

    /**
     * Insere um usuário no banco
     */
    public void inserir() throws SQLException {

        String sql = "INSERT INTO insumo_orcamento "
                + "(tx_nome,"
                + " tx_identificador,"
                + " cd_unidade_insumo,"
                + " nm_quantidade,"
                + " nm_valor_unitario,"
                + " id_insumo,"
                + " id_orcamento,"
                + " cd_tipo_insumo) "
                + "VALUES ("
                + "?," // 01 Nome
                + "?," // 02 Identificador
                + "?," // 03 Unidade do Insumo
                + "?," // 04 Quantidade
                + "?," // 05 Valor Unitário
                + "?," // 06 Insumo
                + "?," // 07 Orcamento
                + "? )"; // 08 Tipo de Insumo
        PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS);

        preparedStatement.setString(1, nome);
        preparedStatement.setString(2, identificador);
        preparedStatement.setInt(3, EnumUnidadeInsumo.ConverterEnumNumero(unidadeInsumo));
        preparedStatement.setInt(4, quantidade);
        preparedStatement.setInt(5, valorUnitario);
        preparedStatement.setInt(6, idInsumo);
        preparedStatement.setInt(7, idOrcamento);
        preparedStatement.setInt(8, EnumTipoInsumo.ConverterEnumNumero(tipoInsumo));

        preparedStatement.executeUpdate();

        //Recebendo o novo id gerado
        ResultSet resultSet = preparedStatement.getGeneratedKeys();
        while (resultSet.next()) {
            id = resultSet.getInt(1);
        }

        preparedStatement.close();
        resultSet.close();
    }

    public void atualizar() throws SQLException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void deletar() throws SQLException {
        String sql = "DELETE FROM insumo_orcamento WHERE id_orcamento = ? "; // Orcamento
        PreparedStatement preparedStatement = JanelaLogin.getConnection().prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS);

        preparedStatement.setInt(1, idOrcamento);

        preparedStatement.executeUpdate();

        preparedStatement.close();
    }

    public LinkedList<String> buscar(String opcao, String palavraBuscada, boolean limite) throws SQLException {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getIdentificador() {
        return identificador;
    }

    public void setIdentificador(String identificador) {
        this.identificador = identificador;
    }

    public UnidadeInsumo getUnidadeInsumo() {
        return unidadeInsumo;
    }

    public void setUnidadeInsumo(UnidadeInsumo unidadeInsumo) {
        this.unidadeInsumo = unidadeInsumo;
    }

    public int getQuantidade() {
        return quantidade;
    }

    public void setQuantidade(int quantidade) {
        this.quantidade = quantidade;
    }

    public int getValorUnitario() {
        return valorUnitario;
    }

    public void setValorUnitario(int valorUnitario) {
        this.valorUnitario = valorUnitario;
    }

    public int getIdOrcamento() {
        return idOrcamento;
    }

    public void setIdOrcamento(int idOrcamento) {
        this.idOrcamento = idOrcamento;
    }

    public TipoInsumo getTipoInsumo() {
        return tipoInsumo;
    }

    public void setTipoInsumo(TipoInsumo tipoInsumo) {
        this.tipoInsumo = tipoInsumo;
    }

    public int getIdInsumo() {
        return idInsumo;
    }

    public void setIdInsumo(int idInsumo) {
        this.idInsumo = idInsumo;
    }

}
